#include "common.h"

static const char *TAG = "WIFI_BEGIN--->";

#define OTA_WIFI_MODE_AP   1            //1为AP模式 0为STA模式

#define AP_SSID "ESP32_OTA_TEST"
#define AP_PWD  "12345678"

#define STA_SSID ""
#define STA_PWD  ""

/**
 * @brief AP模式初始化
 * 
 * @note 
 * 
 * @param none
 *
 * @return none
 */
void WiFi_AP_init()
{
    // 1. 确保 netif 和 WiFi 驱动已初始化（通常在 app_main 调用一次）
    //    esp_netif_init();
    //    esp_event_loop_create_default();
    //    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    //    esp_wifi_init(&cfg);
    //    esp_wifi_set_mode(WIFI_MODE_AP);
    //    esp_wifi_start();
    //
    // 如果你已经在别处做过上面这几步，这里就不必再重复。

    // 2. 创建默认的 AP 网络接口（如果之前没创建过）
    esp_netif_t *ap_netif = esp_netif_create_default_wifi_ap();
    if (ap_netif == NULL) {
        ESP_LOGE(TAG, "esp_netif_create_default_wifi_ap failed");
        return;
    }

    // 3. 配置静态 IP
    esp_netif_ip_info_t ip_info;
    // 注意：esp_ip4addr_aton 的第 2 个参数是 esp_ip4_addr_t*
    ip_info.ip.addr      = esp_ip4addr_aton("192.100.1.1");
    ip_info.gw.addr      = esp_ip4addr_aton("192.100.1.1");
    ip_info.netmask.addr = esp_ip4addr_aton("255.255.255.0");

    ESP_ERROR_CHECK(esp_netif_dhcps_stop(ap_netif));     // 关闭 DHCP Server
    ESP_ERROR_CHECK(esp_netif_set_ip_info(ap_netif, &ip_info));
    ESP_ERROR_CHECK(esp_netif_dhcps_start(ap_netif));    // 启动 DHCP Server

    // 4. 配置并启动 AP
    wifi_config_t ap_config = {
        .ap = {
            .ssid_hidden   = 0,
            .channel       = 9,
            .authmode      = WIFI_AUTH_WPA_WPA2_PSK,
            .max_connection= 5,
        },
    };
    // 填充 SSID/密码
    snprintf((char*)ap_config.ap.ssid, sizeof(ap_config.ap.ssid), "%s", AP_SSID);
    ap_config.ap.ssid_len = strlen(AP_SSID);
    snprintf((char*)ap_config.ap.password, sizeof(ap_config.ap.password), "%s", AP_PWD);

    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &ap_config));

    ESP_LOGI(TAG, "WiFi AP started: SSID=%s  PWD=%s  CH=%d  MaxConn=%d",
             AP_SSID, AP_PWD,
             ap_config.ap.channel,
             ap_config.ap.max_connection);
}


/**
 * @brief STA模式初始化
 * 
 * @note 
 * 
 * @param none
 *
 * @return none
 */
void WiFi_STA_init()
{
    wifi_config_t wifi_config;
    memset(&wifi_config, 0, sizeof(wifi_config_t));
    snprintf((char*)wifi_config.sta.ssid, 32, "%s", STA_SSID);
    snprintf((char*)wifi_config.sta.password, 64, "%s", STA_PWD);
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );

    ESP_LOGI(TAG, "WiFi_STA_init finished----SSID:%s password:%s",
             (char*)wifi_config.sta.ssid, (char*)wifi_config.sta.password);
}


static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{
    ESP_LOGI(TAG,"event_base:%d event_id:%d\r\n",(int)event_base, (int)event_id);
    if (event_base == WIFI_EVENT){
        switch (event_id)
        {
            case WIFI_EVENT_STA_START:                  //STA模式启动
                esp_wifi_connect();
                break;
            case WIFI_EVENT_STA_DISCONNECTED:           //STA模式断开连接
                esp_wifi_connect();
                break;
            default:
                break;
        }
    }else if(event_base == IP_EVENT){
        switch (event_id)
        {
            case IP_EVENT_STA_GOT_IP:                       //esp32从路由器获取到ip
                {
                    ip_event_got_ip_t *STA_GOT_IP_EVENT_DATA = (ip_event_got_ip_t *)event_data;  //获取事件信息
                    printf("IP-------------------"IPSTR"\n",IP2STR(&(STA_GOT_IP_EVENT_DATA->ip_info.ip)));
                }
            default:
                break;
        }
    }
}

void WiFi_init()
{
    //NVS初始化
    ESP_ERROR_CHECK(nvs_flash_init());
    //初始化基础TCP/IP堆栈，只可运行一次
    ESP_ERROR_CHECK(esp_netif_init());
    //事件注册
    ESP_ERROR_CHECK( esp_event_loop_create_default() );
    ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );
    ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL) );
    //WiFi基础初始化 可通过menuconfig设置
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    //WiFi模式设置
#if OTA_WIFI_MODE_AP
    ESP_LOGI(TAG, "Starting in AP mode");
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    WiFi_AP_init();
#else
    ESP_LOGI(TAG, "Starting in STA mode");
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    WiFi_STA_init();
#endif    
    //根据当前配置启动WiFi
    ESP_ERROR_CHECK(esp_wifi_start());  
    //设置省电模式 WIFI_PS_NONE：关 WIFI_PS_MIN_MODEM：最小模式 WIFI_PS_MAX_MODEM：最大模式
    ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); 
    ESP_LOGI(TAG, "WiFi_init complete");
}
